package xmw

import (
	"errors"
	"fmt"
	"gitee.com/xiedongji/antgo/core"
	"gitee.com/xiedongji/antgo/cpts/xlog"
	"gitee.com/xiedongji/antgo/helper/xutils"
	"runtime/debug"

	"github.com/gin-gonic/gin"
)

/* ====================================================================== *
 * 功能:捕获所有panic,并且返回错误信息 (RecoveryMiddleware)
 * 类型:中间件
 * 描述:遇到异常报错后 还会接着往下执行 不会影响整个系统运行
 * ====================================================================== */
func RecoveryMiddleware() gin.HandlerFunc {
	return func(ctx *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				//先做一下日志记录
				xlog.Logger(core.AppLogName, "Request").Error().
					Any("error", err).
					Str("捕获报错信息", string(debug.Stack()))

				if core.RunEnv == core.ProEnv {
					xutils.ResponseError(ctx, errors.New("内部错误"))
					return
				} else {
					xutils.ResponseError(ctx, errors.New(fmt.Sprint(err)))
					return
				}
			}
		}()

		ctx.Next()
	}
}
